package com.zhaokuner.parentstarter.ctrladaptor.model;

import com.zhaokuner.parentstarter.common.ResultData;
import com.zhaokuner.parentstarter.utils.BeanReflectUtil;
import com.zhaokuner.parentstarter.utils.JacksonUtils;
import lombok.ToString;
import org.springframework.http.HttpMethod;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;

/**
 * <p>
 * Description:代理请求对象
 * <p>
 * Copyright: 天津联想协同科技有限公司
 * <p>
 *
 * @author 赵希坤 zhaoxikun
 * @date 2021/2/10 17:03
 */
@ToString
public class CtrlAdaptorReqEntry {

    /**
     * GET, POST
     */
    private HttpMethod httpMethod;
    /**
     * 请求url
     */
    private String url;
    /**
     * 请求参数
     */
    private Object postContent;
    /**
     * 请求参数
     */
    private LinkedHashMap<String, String> params;


    private CtrlAdaptorReqEntry() {
        postContent = new HashMap<>(0);
        params = new LinkedHashMap<>(8);
    }

    /**
     * 方法描述：设置get请求
     *
     * @return com.zhaokuner.parentstarter.ctrladapor.CtrlAdaptorReqEntry
     * @author 赵希坤
     * @date 日期：2021/2/12 时间：19:28
     */
    public static CtrlAdaptorReqEntry get(String url) {
        if (null == url) {
            //TODO 异常
        }
        CtrlAdaptorReqEntry ctrlAdaptorReqEntry = new CtrlAdaptorReqEntry();
        ctrlAdaptorReqEntry.httpMethod = HttpMethod.GET;
        ctrlAdaptorReqEntry.url = url;
        return ctrlAdaptorReqEntry;
    }

    /**
     * 方法描述：设置post请求
     *
     * @return com.zhaokuner.parentstarter.ctrladapor.CtrlAdaptorReqEntry
     * @author 赵希坤
     * @date 日期：2021/2/12 时间：19:29
     */
    public static CtrlAdaptorReqEntry post(String url) {
        if (null == url) {
            //TODO 异常
        }
        CtrlAdaptorReqEntry ctrlAdaptorReqEntry = new CtrlAdaptorReqEntry();
        ctrlAdaptorReqEntry.httpMethod = HttpMethod.POST;
        ctrlAdaptorReqEntry.url = url;
        return ctrlAdaptorReqEntry;
    }

    /**
     * 方法描述：设置post请求内容
     *
     * @param content post请求内容
     * @return com.zhaokuner.parentstarter.ctrladapor.AdaptorUrlModel
     * @author 赵希坤
     * @date 日期：2021/2/10 时间：17:24
     */
    public CtrlAdaptorReqEntry postContent(Object content) {
        postContent = content;
        return this;
    }

    /**
     * 方法描述：parameter 请求参数
     *
     * @param key   参数名称
     * @param value 参数值
     * @return com.zhaokuner.parentstarter.ctrladapor.AdaptorUrlModel
     * @author 赵希坤
     * @date 日期：2021/2/10 时间：17:24
     */
    public CtrlAdaptorReqEntry params(String key, String value) {
        params.put(key, value);
        return this;
    }

    /**
     * 方法描述：如果是String类型就toString，不是就toJson
     *
     * @param obj 数据
     * @return java.lang.String
     * @author 赵希坤
     * @date 日期：2021/2/10 时间：17:26
     */
    private String toJsonString(Object obj) {
        if (obj instanceof CharSequence) {
            return obj.toString();
        }
        return JacksonUtils.toJson(obj);
    }

    /**
     * 方法描述：对象参数,对象的属性名称或map的key为参数名称
     *
     * @param params
     * @return com.zhaokuner.parentstarter.ctrladapor.AdaptorUrlModel
     * @author 赵希坤
     * @date 日期：2021/2/10 时间：17:26
     */
    public CtrlAdaptorReqEntry params(Object params) {
        if (null == params) {
            return this;
        }
        if (params instanceof Map) {
            ((Map<?, ?>) params).forEach((k, v) -> {
                this.params.put(k.toString(), toJsonString(v));
            });
        } else {
            BeanReflectUtil.foreach(params, (name, m, o) -> {
                Object v = m.get(o);
                this.params.put(name, Objects.toString(v, null));
            });
        }
        return this;
    }

    /**
     * 方法描述：合成url
     *
     * @return java.lang.String
     * @author 赵希坤
     * @date 日期：2021/3/3 时间：16:37
     */
    public String toUrl() {
        StringBuilder sb = new StringBuilder();
        sb.append(url.startsWith("/") ? "" : "/").append(url);
        if (!params.isEmpty()) {
            sb.append("?");
            params.forEach((k, v) -> {
                sb.append(k).append("=").append(v).append("&");
            });
            sb.deleteCharAt(sb.length() - 1);
        }
        return sb.toString();
    }

    public <T> ResultData<T> toResultData() {
        return (ResultData<T>) ResultDataCtrlAdaptor.newInstance(this);
    }

    public HttpMethod getHttpMethod() {
        return httpMethod;
    }

    public String getUrl() {
        return url;
    }

    public Object getPostContent() {
        return postContent;
    }

    public LinkedHashMap<String, String> getParams() {
        return params;
    }

}
